package com.azdebugit.redisThreadLocal.test;
/*import com.health.web.common.utils.*;
import com.health.web.modules.entity.UmsMember;
import org.apache.commons.lang.StringUtils;*/
import com.azdebugit.redis.test.RedisUtil;
import com.azdebugit.result.common.ResultDTO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @Author: itdebug
 * @version:: design_pattern_and_otherutils
 * @description:springboot使用redis和ThreadLocal做单点登录
 * 写一个拦截器，对请求方法进行拦截，拦截器会从请求的header中取token信息，如果token信息不存在，则证明用户尚未登录，让用户去登录。
 * 如果token存在则去redis中查找用户的相关信息，讲用户的userCode和名称这些简单的信息存储在redis里。
 * redis中查不到userInfo证明token不合法或者token是一个游客的token，同样跳转登录注册界面。
 * 如果userInfo存在，则讲userInfo存储在 ThreadLocal中，以便其他方法直接获取。
 * @create: 2021/12/19 0:53.
 */
public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisUtil redisUtil;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //token存在header中
        String token = request.getHeader("token");
        if(StringUtils.isBlank(token)){
            HttpRespUtil.respContent(response, ResultDTO.error(PublicResultConstant.INVALID_PARAM_EMPTY.result.getName(),PublicResultConstant.INVALID_PARAM_EMPTY.msg.getValue()));
            return false;
        }
        ThreadUtils.setToken(token);

        //根据token从redis获取用户信息是否存在登录
        UmsMember userInfo = redisUtil.get(PublicResultConstant.USER_INFO_ + token,UmsMember.class);
        if(userInfo==null || StringUtils.isBlank(userInfo.getUserCode()) || userInfo.getId()==null){
            HttpRespUtil.respContent(response,ResultDTO.error(PublicResultConstant.UNAUTHORIZED.result.getName(),PublicResultConstant.UNAUTHORIZED.msg.getValue()));
            return false;
        }
        ThreadUtils.setUserHolder(userInfo);

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        ThreadUtils.remove();
    }

}
